home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / tvalt.exe / TEXT.CPP < prev    next >
C/C++ Source or Header  |  1992-10-05  |  4KB  |  156 lines

  1. #include <dos.h>
  2. #include <tv.h>
  3.  
  4. #define HIBYTE(x) ( ((x) >> 8) & 0xFF )
  5. #define LOBYTE(x) ( (x) & 0xFF )
  6. #define BGATTR(x) ( ((HIBYTE(x)) >> 4) & 0x0F )
  7. #define FGATTR(x) ( (HIBYTE(x)) & 0x0F )
  8.  
  9. static unsigned char strbuf[100];
  10. extern unsigned char shadowAttr;
  11.  
  12. // function: paintChars
  13. // declaration:
  14. //    short paintChars( short x, short y, short max, ushort *buf );
  15. // where:
  16. //        x   = start column (in chars) : 0-based.
  17. //        y   = row (in chars) : 0-based.
  18. //        max = max length of buf.
  19. //        buf = char/attr buffer.
  20. // paintChars() optimizes BIOS calls by searching buf for all the entries
  21. //    (up to max) that have the same character and attribute, then using
  22. //    the video BIOS (interrupt 10h) to draw these chars on the screen.
  23. //    Returns the number of entries printed.
  24.  
  25. static short paintChars( short x, short y, short max, ushort *buf )
  26.     {
  27.     ushort item = *buf;
  28.     short count = 0;
  29.  
  30.     while( count < max && buf[count] == item )
  31.         count++;
  32.  
  33.     // Move the cursor to the starting location.
  34.     _BH = 0;
  35.     _DH = (uchar)y;
  36.     _DL = (uchar)x;
  37.     _AH = 2;
  38.     geninterrupt(0x10);
  39.  
  40.     // print 'count' copies of item to the screen.
  41.     uchar ch = (uchar)LOBYTE(item);
  42.     uchar attr = (uchar)HIBYTE(item);
  43.     _CX = count;
  44.     _BL = attr;
  45.     _BH = 0;
  46.     _AL = ch;
  47.     _AH = 9;
  48.     geninterrupt(0x10);
  49.     return count;
  50.     }
  51.  
  52. // function: paintSChars
  53. // declaration:
  54. //    short paintSChars( short x, short y, short max, ushort *buf );
  55. // where:
  56. //        x   = start column (in chars) : 0-based.
  57. //        y   = row (in chars) : 0-based.
  58. //        max = max length of buf.
  59. //        buf = char/attr buffer.
  60. // paintSChars() optimizes BIOS calls by searching buf for all the entries
  61. //    (up to max) that have the same character, then using the video BIOS
  62. //    (interrupt 10h) to draw these chars on the screen using the shadowAttr
  63. //    attribute. Returns the number of entries printed.
  64.  
  65. static short paintSChars( short x, short y, short max, ushort *buf )
  66.     {
  67.     ushort item = *buf;
  68.     ushort theChar = LOBYTE(item);
  69.     short count = 0;
  70.  
  71.     while( count < max && LOBYTE(buf[count]) == theChar )
  72.         count++;
  73.  
  74.     _BH = 0;
  75.     _DH = (uchar)y;
  76.     _DL = (uchar)x;
  77.     _AH = 2;
  78.     geninterrupt(0x10);
  79.  
  80.     uchar ch = (uchar)theChar;
  81.     uchar attr = (uchar)shadowAttr;
  82.     _CX = count;
  83.     _BL = attr;
  84.     _BH = 0;
  85.     _AL = ch;
  86.     _AH = 9;
  87.     geninterrupt(0x10);
  88.     return count;
  89.     }
  90.  
  91. // function: altWriteMethod
  92. // declaration:
  93. //    void altWriteMethod(short x, short y, short wid, ushort *buf,
  94. //                        short sflag);
  95. // where:
  96. //        x     = start column (in chars) : 0-based.
  97. //        y     = row (in chars) : 0-based.
  98. //        wid   = size of buf.
  99. //        buf   = char/attrib data buffer.
  100. //        sflag = 0 if attrib in buf should be used, <>0 if shadowAttr should
  101. //                be used.
  102.  
  103. void altWriteMethod( short x, short y, short wid, ushort *buf, short sflag )
  104.     {
  105.     ushort *pbuf;
  106.     short iw, count;
  107.     ushort oldpos, oldshape;
  108.  
  109.     // Save the old cursor shape/position.
  110.     _BH = 0;
  111.     _AH = 3;
  112.     geninterrupt(0x10);
  113.     oldpos = _DX;
  114.     oldshape = _CX;
  115.  
  116.     // Hide the cursor
  117.     _CX = 0x2020;
  118.     _AH = 1;
  119.     geninterrupt(0x10);
  120.  
  121.     if( !sflag )    // use attrib data in buf.
  122.         {
  123.         pbuf = buf;
  124.         iw = wid;
  125.         while( iw > 0 )
  126.             {
  127.             count = paintChars( x, y, iw, pbuf );
  128.             x += count;
  129.             pbuf += count;
  130.             iw -= count;
  131.             }
  132.         }
  133.     else            // use shadowAttr.
  134.         {
  135.         pbuf = buf;
  136.         iw = wid;
  137.         while( iw > 0 )
  138.             {
  139.             count = paintSChars( x, y, iw, pbuf );
  140.             x += count;
  141.             pbuf += count;
  142.             iw -= count;
  143.             }
  144.         }
  145.  
  146.     // Restore the cursor position.
  147.     _DX = oldpos;
  148.     _BH = 0;
  149.     _AH = 2;
  150.     geninterrupt(0x10);
  151.  
  152.     // Un-hide the cursor.
  153.     _CX = oldshape;
  154.     _AH = 1;
  155.     geninterrupt(0x10);
  156.     }